package org.japo.java.swing.igu;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import org.japo.java.swing.beans.PanelFondo;
import org.japo.java.swing.listeners.GEA;
import org.japo.java.swing.listeners.GEC;
import org.japo.java.swing.listeners.GEV;

public class IGU extends JFrame {

    //Fichero de bloqueo
    private final String F_BLOQUEO = "instancia.lck";
    
    int MINIMO_SLIDER = 0;
    int MAXIMO_SLIDER = 255;
    int INICIO_SLIDER = 0;
    int PASO_MENOR = 1;
    int PASO_MAYOR = 50;
    
    private JLabel lblPrueba;
    private JTextField txfPrueba;
    private JSlider sldColor;

    //FUENTE
    private final String FNT_FAM = "Segoe Print";
    private final int FNT_EST = Font.PLAIN;
    private final int FNT_TAM = 15;
    
    Font f = new Font(FNT_FAM, FNT_EST, FNT_TAM);

    // Recurso con la imagen de forndo del panel
    private final String RES_PKG = "/org/japo/java/resources/img";
    private final String RES_IMG = "fondo.jpg";
    private final String RECURSO = RES_PKG + "/" + RES_IMG;
    
    public IGU() throws HeadlessException {
        iniciarComponentes();
    }
    
    private void iniciarComponentes() {
        //DIMENSIONES
        //Dimension del label
        Dimension dimLbl = new Dimension(40, 40);
        Dimension dimSld = new Dimension(200, 40);
        Dimension dimTxf = new Dimension(40, 40);

        //Declarar los bordes
        Border brdPrincipal = new EmptyBorder(10, 10, 10, 10);
        Border border = new BevelBorder(BevelBorder.RAISED);

        //Recurso de la imagen del panel de fondo
        URL urlImagen = getClass().getResource(RECURSO);
        Image i = new ImageIcon(urlImagen).getImage();

        //Declarar el Panel Principal
        JPanel pnlPrincipal = new PanelFondo(i);
        pnlPrincipal.setBorder(brdPrincipal);

        //Declarar el LABEL PRUEBA
        lblPrueba = new JLabel();
        lblPrueba.setPreferredSize(dimLbl);
        lblPrueba.setBorder(border);
        lblPrueba.setOpaque(true);
        
        pnlPrincipal.add(lblPrueba);

        //Gestor de eventos de CAMBIO
        GEC gec = new GEC(this);

        //Declarar el SLIDER
        sldColor = new JSlider();
        sldColor.setMinimum(MINIMO_SLIDER);
        sldColor.setMaximum(MAXIMO_SLIDER);
        sldColor.setValue(INICIO_SLIDER);
        sldColor.setFont(f);
        sldColor.setPaintLabels(false);
        sldColor.setPaintTicks(false);
        sldColor.setMinorTickSpacing(PASO_MENOR);
        sldColor.setMajorTickSpacing(PASO_MAYOR);
        sldColor.addChangeListener(gec);
        sldColor.setOpaque(false);
        sldColor.setPreferredSize(dimSld);
        pnlPrincipal.add(sldColor);

        //Gestor de eventos de ACCION
        GEA gea = new GEA(this);

        //Declarar el TEXTFIELD
        txfPrueba = new JTextField();
        txfPrueba.setSize(dimTxf);
        txfPrueba.setFont(f);
        txfPrueba.setOpaque(true);
        txfPrueba.setText(sldColor.getValue() + "");
        txfPrueba.setPreferredSize(dimTxf);
        txfPrueba.addActionListener(gea);
        pnlPrincipal.add(txfPrueba);

        //Gestor de eventos de ventana
        GEV gev = new GEV(this);

        //Declarar ventana
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Cambiador");
        setContentPane(pnlPrincipal);
        setResizable(false);
        addWindowListener(gev);
        setSize(350, 110);
        setLocationRelativeTo(null);
        
    }
    
    public void procesarCambioColor(Object o) {
        int color;
        int colorError;
        int vSld = sldColor.getValue();
        
        if (o.equals(sldColor) && vSld >= MINIMO_SLIDER && vSld <= MAXIMO_SLIDER) {
            try {
                if (o.equals(sldColor) && vSld >= MINIMO_SLIDER && vSld <= MAXIMO_SLIDER) {
                    color = sldColor.getValue();
                    txfPrueba.setText(color + "");
                    Color colorFondo = new Color(color, color, color);
                    lblPrueba.setBackground(colorFondo);
                } else {
                    color = Integer.parseInt(txfPrueba.getText());
                    sldColor.setValue(color);
                }
                
            } catch (Exception e) {
                colorError = sldColor.getValue();
                sldColor.setValue(colorError);
                txfPrueba.setText(colorError + "");
            }
            
        } else {
            colorError = sldColor.getValue();
            sldColor.setValue(colorError);
            txfPrueba.setText(colorError + "");
        }
    }
    
    public void activarInstancia() throws IOException {
        //Crea un objeto File a partie del nombre del fichero 
        File f = new File(F_BLOQUEO);

        //Comprueba si el ficher fisico existe o no
        boolean existeOk = f.exists();

        //Tramita el resultado de la comprobacion
        if (!existeOk) {
            f.createNewFile();
        } else {
            throw new IOException("Ya existe una copia en ejecucion");
        }
    }
    
    public void desactivarInstancia() throws IOException {
        File f = new File(F_BLOQUEO);
        
        boolean existeOk = f.exists();
        if (existeOk) {
            f.delete();
        } else {
            throw new IOException("Hay un problema en la anulacion del bloqueo");
        }
    }
    
    public void terminarPrograma() {
        //Oculta la ventana 
        setVisible(false);

        //Libera recursos graficos
        dispose();

        //Termina el hilo principal
        System.exit(0);
    }
    
}
